package club.pchome.interceptor;

import club.pchome.utils.RedisUtil;
import com.alibaba.druid.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * 拦截器 用户权限校验
 * 创建者   科帮网 
 * 创建时间  2017年11月24日
 */
//@Component
@Slf4j
public class SysInterceptor implements HandlerInterceptor {  
    
	@Autowired
	RedisUtil redisUtil;


    /**
     * 获取头文件信息
     *
     * @param request
     * @return
     */
    public static Map<String, String> getHeadersInfo(HttpServletRequest request) {
        Map<String, String> map = new HashMap<String, String>();
        Enumeration headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = (String) headerNames.nextElement();
            String value = request.getHeader(key);
            System.out.println(key + "：" + value);
            map.put(key, value);
        }
        return map;
    }

    /**
     * 在请求处理之前进行调用（Controller方法调用之前）
     * 只有返回true才会继续向下执行，返回false取消当前请求
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    	if (handler instanceof HandlerMethod){
    	    String token = null;

            Cookie[] cookies = request.getCookies();
            //遍历所有的cookie,然后根据cookie的key值来获取value值
            if (cookies!=null) {
                for (Cookie cookie : cookies) {
                    System.out.println(cookie.getName()+" - "+cookie.getValue());
                    if (cookie.getName().equals("ACCESS_TOKEN")) {
                        token = cookie.getValue();
                    }
                }
            }else {
                System.out.println("NO COOKIE !!!");
            }

            if (!StringUtils.isEmpty(token)) {
                boolean b = redisUtil.hasKey("ACCESS_TOKEN:"+token);
                if(!b){
                    log.info("[登录校验拦截器]-TOKEN 过期");
                    return false;
                }

                long expireTime = 300;
                if(expireTime > redisUtil.getExpire("ACCESS_TOKEN:"+token)){
                    //续费 300s
                    redisUtil.expire("ACCESS_TOKEN:"+token , 1800);
                }
                return true;
            }
            log.info("[登录校验拦截器]-TOKEN 不存在");
            return false;
		}
        return true;
    }

    /**
     * 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {

        System.out.println(request.getRequestURI());
        System.out.println("state : " + response.getStatus());

//        if(response.getStatus()==500){
//            modelAndView.setViewName("/error/500");
//        }else if(response.getStatus()==404){
//            modelAndView.setViewName("/error/404");
//        }
    }  
  
    /**  
     * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后，也就是DispatcherServlet渲染了视图执行，  
     * 这个方法的主要作用是用于清理资源的，当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。  
     */    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {  
    }

}  